package br.com.tcc.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;

import br.com.tcc.dao.AnuncianteDAO;
import br.com.tcc.dao.ProdutoAndAnuncianteDAO;
import br.com.tcc.dao.ProdutoDao;
import br.com.tcc.model.Anunciante;
import br.com.tcc.model.ListaDeComprasAndProduto;
import br.com.tcc.model.Produto;
import br.com.tcc.model.ProdutoAndAnunciante;
import br.com.tcc.util.Utils;

@ManagedBean(name ="carrinhoBean")
@SessionScoped
public class CarrinhoBean {
	
	Logger logger = Logger.getLogger(CarrinhoBean.class);
	
	private List<ListaDeComprasAndProduto> carrinho;
	
	private List<ProdutoAndAnunciante> listFiltroAnunciante;
	
	private List<SelectItem> listAnunciantes;
	
	private int qtde;
	
	private double total;
	
	private double totalListaFiltro;
	
	private ProdutoDao pDAO = new ProdutoDao();
	
	private Anunciante anunciante = new Anunciante();
	
	private String mostrarCarrinhoFiltro;
	
	private int id;
	
	public CarrinhoBean() {
		if (carrinho == null) {
			carrinho = new ArrayList<ListaDeComprasAndProduto>();
		}
		id = 0;
		qtde =0;
		setMostrarCarrinhoFiltro("false");
		listAnunciantes = null;
	}
	
	public String mostrarCarrinho() {
		id = 0;
		qtde =0;
		setAnunciante(new Anunciante());
		setMostrarCarrinhoFiltro("false");
		listAnunciantes = null;
		return "meuCarrinho";
	}
/**
 * Adicionar um item ao carrinho de compras do usuario
 */
	public void addCarrinho() {
		boolean existe = false;
		int aux =0;
		ListaDeComprasAndProduto novo = new ListaDeComprasAndProduto();
		Produto p;
		logger.info("produto_id : "+id);
		
		//Verificar se o produto que esta sendo adicionado no carrinho ja existe na lista.
		for (int i = 0; i < carrinho.size(); i++) {
			if (carrinho.get(i).getProduto().getId() == id) {
				aux = carrinho.get(i).getQtde() + qtde;
				carrinho.get(i).setQtde(aux);
				existe = true;
				logger.info("**********************************");
				logger.info("Nova quantidade = " + carrinho.get(i).getQtde());
				logger.info("Id do produto = " + carrinho.get(i).getProduto().getId());
				logger.info("**********************************");
			}
		}
		
		// Se o produto nao estiver no carrinho buscar o produto e adiciona-lo
		if (!existe) {
			p = pDAO.buscarId(id);
			novo.setProduto(p);
			novo.setQtde(qtde);
			carrinho.add(novo);
			logger.info(" Qtde = " + novo.getQtde());
			logger.info("Id produto = " + novo.getProduto().getId());
		}
		setQtde(0);
		Utils.addMessageSucesso("Produto adicionado com sucesso.");
	}
	/**
	 * Remover um produto do carrinho de compras
	 */
	public void removerProdutoCarrinho() {
		for (int i = 0; i < carrinho.size(); i++) {
			if (carrinho.get(i).getProduto().getId() == id) {
				carrinho.remove(i);
			}
		}
	}
	/**
	 * Filtrar os produtos apresentados no carrinho para um anunciante
	 */
	public void filtrarCarrinhoPorAnunciante() {
		logger.info("Entrando no metodo filtrarCarrinhoPorAnunciante()");
		logger.info("Valor para o anunciante [ " + anunciante.getIdAnunciante() + " ]");
		
		if (carrinho == null || carrinho.size() == 0) {
			Utils.addMessageErro("Voce deve adicionar itens no seu carrinho para poder filtra-lo por anunciante");
			anunciante.setIdAnunciante(0);
			return;
		}
		if (anunciante.getIdAnunciante() != 0) {
			AnuncianteDAO aDAO = new AnuncianteDAO();
			listFiltroAnunciante = new ArrayList<ProdutoAndAnunciante>();
			ProdutoAndAnuncianteDAO pAnuncDAO = new ProdutoAndAnuncianteDAO();
			ProdutoAndAnunciante p;
			anunciante = aDAO.buscarId(anunciante.getIdAnunciante());
			for (int i = 0; i <carrinho.size(); i++) {
				logger.info("***************************");
				logger.info(" Indo chamar o metodo pAnuncDAO.buscarProdutoAnunciante( [" +
										anunciante.getIdAnunciante() + " ] [ " + carrinho.get(i).getProduto().getId() + " ] )");
				p = pAnuncDAO.buscarProdutoAnunciante(anunciante.getIdAnunciante(), carrinho.get(i).getProduto().getId());
				
				if (p !=null) {
					//Salvar a quantidade de cada produto
					p.setQtde(carrinho.get(i).getQtde());
					listFiltroAnunciante.add(p);
				}
			}
			setMostrarCarrinhoFiltro("true");
			logger.info("Total de produtos encontrados [ " + listFiltroAnunciante.size() + " ]");
		}else {
			setMostrarCarrinhoFiltro("false");
		}
	}
	
	/**
	 * Atualizar o carrinho de compras quando usuario alterar algum valor
	 * @return
	 */
	public String atualizarCarrinho() {
		return "meuCarrinho";
	}
	
	public List<ListaDeComprasAndProduto> getCarrinho() {
		if (carrinho == null) {
			carrinho = new ArrayList<ListaDeComprasAndProduto>();
		}
		return carrinho;
	}
	
	public void setCarrinho(List<ListaDeComprasAndProduto> carrinho) {
		this.carrinho = carrinho;
	}

	public double getTotal() {
		total = 0;
		for (int i = 0; i < carrinho.size(); i++) {
			total += carrinho.get(i).getQtde() * carrinho.get(i).getProduto().getPrecoMaisBarato();
		}
		return total;
	}
	/**
	 * Apresentar o total do carrinho
	 * @return
	 */
	public void setTotal(double total) {
		this.total = total;
	}
	/**
	 * Apresentar o total do carrinho de filtro quando nescessario
	 * @return
	 */
	public double getTotalListaFiltro() {
		totalListaFiltro = 0;
		for (int i = 0; i < listFiltroAnunciante.size(); i++) {
			totalListaFiltro += listFiltroAnunciante.get(i).getQtde() * listFiltroAnunciante.get(i).getPrecoPor();
		}
		
		
		return totalListaFiltro;
	}
	public void setTotalListaFiltro(double totalListaFiltro) {
		this.totalListaFiltro = totalListaFiltro;
	}

	public int getQtde() {
		return qtde;
	}

	public void setQtde(int qtde) {
		this.qtde = qtde;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public Anunciante getAnunciante() {
		if (anunciante == null) {
			anunciante = new Anunciante();
		}
		return anunciante;
	}
	
	public void setAnunciante(Anunciante anunciante) {
		this.anunciante = anunciante;
	}
	
	public String getMostrarCarrinhoFiltro() {
		if (mostrarCarrinhoFiltro == null || mostrarCarrinhoFiltro.equals("")) {
			mostrarCarrinhoFiltro = "false";
		}
		return mostrarCarrinhoFiltro;
	}
	public void setMostrarCarrinhoFiltro(String mostrarCarrinhoFiltro) {
		this.mostrarCarrinhoFiltro = mostrarCarrinhoFiltro;
	}
	public List<ProdutoAndAnunciante> getListFiltroAnunciante() {
		if (listFiltroAnunciante == null) {
			listFiltroAnunciante = new ArrayList<ProdutoAndAnunciante>();
		}
		return listFiltroAnunciante;
	}
	public void setListFiltroAnunciante(List<ProdutoAndAnunciante> listFiltroAnunciante) {
		this.listFiltroAnunciante = listFiltroAnunciante;
	}

	public List<SelectItem> getListAnunciantes() {
		if (listAnunciantes == null) {
			AnuncianteDAO aDAO = new AnuncianteDAO();
			List<Anunciante> listaAnunciantes = aDAO.buscarAnunciantesAtivos();
			listAnunciantes = new ArrayList<SelectItem>();
			for (int i = 0; i < listaAnunciantes.size(); i++) {
				Anunciante a = listaAnunciantes.get(i);
					listAnunciantes.add(new SelectItem(a.getIdAnunciante(), a.getRazaoSocial() + " - " + a.getEndereco().getBairro()));
			}
		}
		return listAnunciantes;
	}

	public void setListAnunciantes(List<SelectItem> listAnunciantes) {
		this.listAnunciantes = listAnunciantes;
	}
	

}
